/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package reconocedor.main;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;

/**
 *
 * @author laptop-w8
 */
public class JPanelMatriz extends javax.swing.JPanel {

    private String nombreArchivo = "a1";
    private static final int PORCENTAJE = 75;
    private String rutaImagen = null;
    private BufferedImage imagenBufferedImage = null;
    private int ancho = 400;
    private int alto = 400;
    private int numeroFilas = 7;
    private int numeroColumnas = 6;
    private int[][] matriz;
    boolean analisis = false;
    boolean generar = false;

    /**
     * Creates new form JPanelMatriz
     */
    public JPanelMatriz() {
        initComponents();
        crearMatriz();
        Dimension d = new Dimension(alto, ancho);
        this.setPreferredSize(d);
        this.setSize(d);
    }

    @Override
    public void paint(Graphics g) {
        if (rutaImagen != null) {
            if (!analisis && !generar) {
                cargarImagen();
            }
            g.drawImage(imagenBufferedImage, 0, 0, ancho, alto, this);
            if (analisis) {
                mostrarImagenAzul(g);
            }
            if (generar) {
                generarImagenMatrizAzul(g);
            }
            pintarLineasMatriz(g);
            this.setSize(ancho, alto);
            Dimension d = new Dimension(ancho, alto);
            this.setPreferredSize(d);
            setOpaque(false);
        }
        super.paint(g); //To change body of generated methods, choose Tools | Templates.
    }

    public void crearMatriz() {
        matriz = new int[numeroFilas][numeroColumnas];
    }

    /**
     * Cargamos la imagen y la recortamos en ancho multiplo de 6 y la altura
     * multiplo de 7 para que se vea mejor.
     */
    public void cargarImagen() {
        analisis = false;
        generar = false;
        try {
            imagenBufferedImage = ImageIO.read(new File(rutaImagen));
        } catch (IOException ex) {
        }
        crearMatriz();
        ancho = (imagenBufferedImage.getWidth() / numeroColumnas) * numeroColumnas;
        alto = (imagenBufferedImage.getHeight() / numeroFilas) * numeroFilas;
        imagenBufferedImage = imagenBufferedImage.getSubimage(0, 0, ancho, alto);
    }

    /**
     * Metodo que se encarga de procesar las imagenes identifica que pixeles son
     * blancos y negros
     */
    public void analisis() {
        analisis = true;
        generar = false;
        BufferedImage imagenBufferedImageAuxiliar = null;
        int rojo = 0;
        int verde = 0;
        int azul = 0;
        int total = 0;
        int aproxBlanco = 0;
        int aproxNegro = 0;
        for (int i = 0; i < numeroFilas; i++) {
            for (int j = 0; j < numeroColumnas; j++) {
                int x0 = (imagenBufferedImage.getWidth() / numeroColumnas) * j;
                int y0 = (imagenBufferedImage.getHeight() / numeroFilas) * i;
                int x1 = imagenBufferedImage.getWidth() / numeroColumnas;
                int y1 = imagenBufferedImage.getHeight() / numeroFilas;
                imagenBufferedImageAuxiliar = imagenBufferedImage.getSubimage(x0, y0, x1, y1);
                for (int m = 0; m < (imagenBufferedImageAuxiliar.getHeight()); m++) {
                    for (int n = 0; n < (imagenBufferedImageAuxiliar.getWidth()); n++) {
                        rojo = new Color(imagenBufferedImageAuxiliar.getRGB(n, m)).getRed();
                        verde = new Color(imagenBufferedImageAuxiliar.getRGB(n, m)).getGreen();
                        azul = new Color(imagenBufferedImageAuxiliar.getRGB(n, m)).getBlue();

                        if (rojo > 220 && verde > 220 && azul > 220) {
                            aproxBlanco++;
                        } else {
                            aproxNegro++;
                        }
                        total = aproxBlanco + aproxNegro;
                    }
                }
                if ((aproxNegro * 1.0 / total * 1.0) * 100 > PORCENTAJE) {
                    matriz[i][j] = 1; //(aproxNegro/total)*100;

                } else {
                    matriz[i][j] = 0;//100-(aproxNegro/total)*100;
                }
                aproxBlanco = 0;
                aproxNegro = 0;
                total = 0;
            }
        }
    }

    /**
     * Metodo que genera un archivo para su procesamiento en Matlab
     *
     */
    public void generar() {
        analisis = false;
        generar = true;
        PrintStream output = null;
        nombreArchivo = getHoraFechaActual();
        try {
            output = new PrintStream(new File("salidaMatriz/" + (nombreArchivo) + ".txt"));
            String sc = "";
            for (int i = 0; i < numeroFilas; i++) {
                for (int j = 0; j < numeroColumnas; j++) {
                    if (i == (numeroFilas - 1) && j == (numeroColumnas - 1)) {
                        sc += (int) (matriz[i][j]);
                    } else {
                        sc += (int) (matriz[i][j]) + "\t";
                    }
                }
            }
            output.println(sc);
            output.close();
        } catch (FileNotFoundException ex) {
            System.out.println("Excepcion: " + ex);
        } finally {
            output.close();
        }
    }

    public void mostrarImagenAzul(Graphics g) {
        int rojo = 0;
        int verde = 0;
        int azul = 0;
        for (int m = 0; m < (imagenBufferedImage.getHeight()); m++) {
            for (int n = 0; n < (imagenBufferedImage.getWidth()); n++) {
                rojo = new Color(imagenBufferedImage.getRGB(n, m)).getRed();
                verde = new Color(imagenBufferedImage.getRGB(n, m)).getGreen();
                azul = new Color(imagenBufferedImage.getRGB(n, m)).getBlue();

                if (rojo > 220 && verde > 220 && azul > 220) {
                } else {
                    g.setColor(Color.BLUE);
                    g.drawLine(n, m, n, m);
                }
            }
        }
    }

    public void pintarLineasMatriz(Graphics g) {
        // pinta horizontales
        for (int i = 1; i <= (numeroFilas - 1); i++) {
            g.setColor(Color.red);
            g.drawLine(0, (alto / numeroFilas) * i, ancho, (alto / numeroFilas) * i);
        }
        // pinta verticales
        for (int i = 1; i <= (numeroColumnas - 1); i++) {
            g.setColor(Color.red);
            g.drawLine((ancho / numeroColumnas) * i, 0, (ancho / numeroColumnas) * i, alto);
        }
    }

    public void generarImagenMatrizAzul(Graphics g) {
        for (int i = 0; i < numeroFilas; i++) {
            for (int j = 0; j < numeroColumnas; j++) {
                if (matriz[i][j] == 1) {
                    g.setColor(Color.BLUE);
                } else {
                    g.setColor(Color.WHITE);
                }
                g.fillRect((ancho / numeroColumnas) * j, (alto / numeroFilas) * i,
                        (ancho / numeroColumnas) * (j + 1), (alto / numeroFilas) * (i + 1));
            }
        }
    }

    public void salidaBinaria() {
        for (int j = 0; j < numeroFilas; j++) {
            for (int i = 0; i < numeroColumnas; i++) {
                System.out.print("  " + matriz[j][i]);
            }
            System.out.println("");
        }
    }

    //Metodo usado para obtener la fecha actual
    //@return Retorna un <b>STRING</b> con la fecha actual formato "dd-MM-yyyy"
    public String getHoraFechaActual() {
        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
        return formateador.format(ahora);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 301, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 177, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables

    public BufferedImage getImagenBufferedImage() {
        return imagenBufferedImage;
    }

    public void setImagenBufferedImage(BufferedImage imagenBufferedImage) {
        this.imagenBufferedImage = imagenBufferedImage;
    }

    public String getRutaImagen() {
        return rutaImagen;
    }

    public void setRutaImagen(String rutaImagen) {
        this.rutaImagen = rutaImagen;
    }

    public int getAncho() {
        return ancho;
    }

    public void setAncho(int ancho) {
        this.ancho = ancho;
    }

    public int getAlto() {
        return alto;
    }

    public void setAlto(int alto) {
        this.alto = alto;
    }

    public boolean isAnalisis() {
        return analisis;
    }

    public void setAnalisis(boolean analisis) {
        this.analisis = analisis;
    }

    public int getNumeroFilas() {
        return numeroFilas;
    }

    public void setNumeroFilas(int numeroFilas) {
        this.numeroFilas = numeroFilas;
    }

    public int getNumeroColumnas() {
        return numeroColumnas;
    }

    public void setNumeroColumnas(int numeroColumnas) {
        this.numeroColumnas = numeroColumnas;
    }
}
